枚举

例如材质中的BlendMode枚举代码如下:

UENUM(BlueprintType)  
enum EBlendMode  
{  
    BLEND_Opaque UMETA(DisplayName="Opaque"),  
    BLEND_Masked UMETA(DisplayName="Masked"),  
    BLEND_Translucent UMETA(DisplayName="Translucent"),  
    BLEND_Additive UMETA(DisplayName="Additive"),  
    BLEND_Modulate UMETA(DisplayName="Modulate"),  
    BLEND_AlphaComposite UMETA(DisplayName = "AlphaComposite (Premultiplied Alpha)"),  
    BLEND_AlphaHoldout UMETA(DisplayName = "AlphaHoldout"),  
    BLEND_MAX,  
};

UMETA以及其他诸如UPROPERTY之类的宏,其定义都是如下:

#define UPROPERTY(...)

这意味着这这些宏可以接受任意参数,且什么都不做。因为这是给Unreal Header Tool的标记,UHT会读取到宏中的参数来进行操作,例如提供反射、提供元信息。 上面的UMETA(DisplayName="Opaque")是为材质编辑器或蓝图或其他接口提供元信息,而如果想对枚举进行序列化反序列化支持,那么就需要用如下的方法:

UCLASS(hidecategories=Object, MinimalAPI, BlueprintType)  
class UMaterial : public UMaterialInterface  
{  
    GENERATED_UCLASS_BODY()
    ...
    TEnumAsByte<enum EBlendMode> BlendMode;
    ...
}

TEnumAsByte把枚举以uint8的格式进行存储。但是官方建议现在使用继承自uint8_t的enum class,能有一样的效果。